/**
 * Alipay.com Inc.
 * Copyright (c) 2004-2016 All Rights Reserved.
 */
package com.alipay.study.common.util.date;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.log4j.Logger;

import com.alipay.study.common.util.log.LogUtil;
import com.alipay.study.common.util.string.StringUtil;

/**
 * 
 * @author wb-qlj205528
 * @version $Id: DateUtil.java, v 0.1 2016年11月10日 下午3:16:46 wb-qlj205528 Exp $
 */
public class DateUtil {
    /**
     * 
     */
    private static Logger      LOGGER         = Logger.getLogger(DateUtil.class);

    /**
     * yyyy-MM-dd HH:mm:ss时间格式
     */
    public final static String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /**
     * 以默认的时间格式，将java.util.Date格式化为String 
     * 
     * yyyy-MM-dd HH:mm:ss
     * 
     * @param date  将要被格式化的java.util.Date
     * @return  格式化后的String
     */
    public static String formatDefault(Date date) {
        return format(date, DEFAULT_FORMAT);
    }

    /**
     * 将java.util.Date转换为String
     * 
     * @param date     需要转换的java.util.Date
     * @param format   将Date转换为String所使用的DateFormat
     * @return  格式化后的String
     */
    public static String format(Date date, DateFormat format) {
        if (null == date || null == format) {
            return StringUtil.STRING_EMPTY;
        }
        return format.format(date);
    }

    /**
     * 根据传入的时间格式将java.util.Date 转换为String
     * 
     * @param date      需要被转换为String的java.util.Date
     * @param format    转换成的String的时间格式
     * @return  格式化后的String
     */
    public static String format(Date date, String format) {
        return format(date, getFormat(format));
    }

    /**
     * 将默认格式的String类型的时间转换为java.util.Date
     * 
     * yyyy-MM-dd HH:mm:ss
     * 
     * @param dateStr  默认格式的String类型的时间
     * @return  java.util.Date
     */
    public static Date parseDafault(String dateStr) {
        return parse(dateStr, DEFAULT_FORMAT);
    }

    /**
     * 将String类型的时间转换成java.util.Date
     * 
     * @param dateStr  String类型的时间
     * @param format    执行时间转换的DateFormat对象
     * @return  java.util.Date
     * @throws ParseException
     */
    public static Date parse(String dateStr, DateFormat format) throws ParseException {
        if (null == format || StringUtil.isEmpty(dateStr)) {
            return null;
        }
        return format.parse(dateStr);
    }

    /**
     * 将String类型的时间转换为java.util.Date
     * 
     * @param dateStr   String类型的时间
     * @param format    String类型的时间格式
     * @return  java.util.Date
     */
    public static Date parse(String dateStr, String format) {
        Date date = null;
        try {
            if (StringUtil.isNotEmpty(dateStr) && StringUtil.isNotEmpty(format)) {
                date = parse(dateStr, getFormat(format));
            }
        } catch (ParseException e) {
            LogUtil.warn(LOGGER, "DateUtil.parse(String dateStr, String format) 异常  date:",
                dateStr, ",format:", format);
        }
        return date;
    }

    /**
     * 根据传入的时间格式返回一个SimpleDateFormat
     * @param format  时间格式
     * @return  DateFormat
     */
    private static DateFormat getFormat(String format) {
        return new SimpleDateFormat(format);
    }
}
